#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<map<ll, ll>> mp;
ll get(ll x, ll w)
{
auto it = mp[x].lower_bound(w);
if(it == mp[x].begin())
return 1;
it--;
return it->second + 1;
}
void solve()
{
ll n, m;
cin >> n >> m;
mp.resize(n+1);
ll answer = 0;
for (ll i = 0; i < m; i++)
{
ll a, b, w;
cin >> a >> b >> w;
ll val = get(a, w);
if(get(b, w + 1) > val)
continue;
mp[b][w] = max(mp[b][w], val);
auto it = mp[b].upper_bound(w);
while(it != mp[b].end() && it->second <= val)
{
it = mp[b].erase(it);
}
answer = max(answer,val);
}
cout << answer << endl;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
}/*1691053055.4208179*/
302A - Eugeny and Array | 1638B - Odd Swap Sort |
1370C - Number Game | 1206B - Make Product Equal One |
131A - cAPS lOCK | 1635A - Min Or Sum |
474A - Keyboard | 1343A - Candies |
1343C - Alternating Subsequence | 1325A - EhAb AnD gCd |
746A - Compote | 318A - Even Odds |
550B - Preparing Olympiad | 939B - Hamster Farm |
732A - Buy a Shovel | 1220C - Substring Game in the Lesson |
452A - Eevee | 1647B - Madoka and the Elegant Gift |
1408A - Circle Coloring | 766B - Mahmoud and a Triangle |
1618C - Paint the Array | 469A - I Wanna Be the Guy |
1294A - Collecting Coins | 1227A - Math Problem |
349A - Cinema Line | 47A - Triangular numbers |
1516B - AGAGA XOOORRR | 1515A - Phoenix and Gold |
1515B - Phoenix and Puzzle | 155A - I_love_username |